#!/bin/bash

# =============== 安装必需的参数 ===============
rootdir=`pwd`
filename="{[{FileName}]}"
installFile="$rootdir/download/$filename"
wgeturl="-P $rootdir/download {[{sourceURL}]}/$filename"
user="mysql"
home_dir="{[{InstallDir}]}"
yum_list=(libaio numactl-devel)
install_log="$rootdir/mysql_install.log"
installtime=$(date "+%Y%m%d_%H%M%S")
cnfbuild="$rootdir/res/mycnf.sh"
function getVersion(){
    InstallVersion=`echo $installFile | sed 's/.*\(.ysql.*\).tar.*/\1/g'`
}
# =============== 到这里结束 ===============

# =============== init.d参数 ===============
init_name="mysql"
port="3306"
initsh="$rootdir/res/${init_name}_init.sh"
pidfile="$home_dir/mysql/run/mysql.pid"
confdir="$home_dir/mysql/conf/my.cnf"
bindir="$home_dir/mysql/bin"
sockdir="$home_dir/mysql/run/mysql.sock"


helplist="= = = = = = = = = 帮助 = = = = = = = = =
 -f/--file          指定源tar文件(默认为$installFile)
 -h/--help          帮助文档
 --init             仅生成init.d脚本
 --conf             生成配置文件
 --mysqlinit        已生成配置文件后初始化数据库
 --path             echo \"export PATH=\$PATH:$home_dir/mysql/bin\" >> /etc/profile
 install/--install  安装$InstallVersion并生成/etc/init.d/$init_name,此参数必需放在最后，否则会跳过后面的参数
 --optestinstall      用于OpManager测试安装(并非真实安装，只是生成了校验文件)"

Params=$@

# 捕捉Ctrl+C
trap 'onCtrlC' INT

function onCtrlC (){
    echo 用户退出脚本,日志记录:$install_log
    echo_log 3 "用户退出脚本"
    echo -e "\n\n==========退出脚本：$(date "+%Y-%m-%d %H:%M:%S")==========" >> $install_log
    exit 20
}


# 无需控制的变量
listlen=${#yum_list[@]}

source res/echo_log.sh
source res/optest.sh

function exitscripts(){
    case $1 in
        1)
            echo -e "\033[41;37m下载失败\033[0m" 
            echo_log 3 "$wgeturl 下载失败"
            exit $1
        ;;
        2)
            echo -e "下载完成，文件保存在当前目录下，请重新指定" 
            echo_log 2 "$wgeturl 下载完成，文件保存在当前目录下，请重新指定"
            exit $1
        ;;
        3)
            echo -e "yum安装失败" 
            echo_log 3 "yum安装失败"
            exit $1
        ;;
        4)
            echo -e "$cnfbuild文件不存在" 
            echo_log 3 "$cnfbuild文件不存在"
            exit $1
        ;;
        5)
            echo -e "$initsh文件加载失败" 
            echo_log 3 "$initsh文件加载失败"
            exit $1
        ;;
        6)
            echo -e "复制失败" 
            echo_log 3 "复制mysql到$home_dir失败"
            exit $1
        ;;
        7)
            echo -e "无有效参数被指定，请参考帮助：\n$helplist"
            exit $1
        ;;
        8)
            echo -e "$home_dir/mysql/conf/my.cnf不存在，请先生成my.cnf"
            echo_log 3 "$home_dir/mysql/conf/my.cnf不存在"
            exit $1
        ;;
        9)
            echo -e "mysql初始化失败"
            echo_log 3 "mysql初始化失败"
            exit $1
        ;;
        *) echo "[error code: $1 ]"
        ;;
    esac
}

# 检查文件是否存在
function fileexist()
{   
    if [ ! -e $1 ];then
        echo -e "\033[43;37m 文件 $1 不存在，开始下载:$wgeturl \033[0m"
	echo_log 3 "文件 $1 不存在，开始下载:$wgeturl"
        rpm -q wget
        wgetres=$?
    else
        return 0
    fi
    if [ $wgetres -ne 0 ];then
        yum -y install wget && exitscripts 3
        echo 安装wget完成
        echo_log 1 安装wget完成
    fi
    wget $wgeturl || exitscripts 1
    echo -e "\n\n==========重新开始脚本：$(date "+%Y-%m-%d %H:%M:%S")==========" >> $install_log
    AllParams $Params
}

# 安装编译需要的环境和创建用户
function installEnv(){
    yum_install_res=`yum -y install ${yum_list[*]}`
    echo_log 0 "$yum_install_res"
    id $user
    if [ $? -ne 0 ];then
        useradd $user
        echo 创建$user用户
        echo_log 1  创建用户:$user
    else
        echo_log 0  用户:$user已存在
    fi
}

# 检查环境
function checkEnv(){
    echo -e "\033[44;37m环境包一共：$listlen 个\033[0m"
    EnvReady=0
    res=256
    for item in ${yum_list[*]}
    do
        rpm -q $item
        if [ $? -ne 0 ];then
            yum -y install $item
            res=$?
        else
            ((EnvReady++))
        fi
        if [ $res -eq 256 ];then
            echo "√"
        elif [ $res -eq 0 ];
        then
            echo_log 2 "检查发现$item未安装，重装成功"
            echo -e "检查发现$item未安装，重装成功" 
        else
            echo_log 3 "检查发现$item未安装，且重装失败"
            echo -e "\033[41;37m检查发现$item未安装，且重装失败\033[0m" 
        fi
    done
}

# 解压文件
function unarchive(){
    if [ ! -d mysql ];then
        getVersion
        tar -zxf "$installFile" && mv "$InstallVersion" mysql && echo  -e "\033[42;37m解压完成\033[0m" && echo_log 1 解压完成 || echo_log 3 "解压失败"
    else
        echo -e "\033[44;37mmysql目录已存在，跳过解压\033[0m"
        echo_log 0 mysql目录已存在，跳过解压
    fi
}

# 将二进制文件复制到$home_dir
function copyFile(){
    echo "复制mysql目录至$home_dir"
    echo_log 1 "复制mysql目录至$home_dir"
    cp -a mysql $home_dir && echo_log 1 "复制成功" || exitscripts 6
}

# 将环境变量加入PATH
function updatePATH()
{
    echo "export PATH=\$PATH:$home_dir/mysql/bin" >> /etc/profile
}

# 生成my.cnf
source $cnfbuild || exitscripts 4


# ======================= 下面是生成init.d的函数 =======================
source $initsh || exitscripts 5
function init_scripts(){
    echo -e "==========生成init.d脚本：$(date "+%Y-%m-%d %H:%M:%S")==========\n\n" >> $install_log
    echofile
    echo_log 1 "生成init.d脚本：init_$init_name"
    chmod +x init_$init_name
    echo_log 1 "给予可执行权限：init_$init_name"
    cp init_$init_name /etc/init.d/$init_name
    echo_log 1 "复制至：/etc/init.d/$init_name"
    echo -e "\033[42;37m生成结束：/etc/init.d/$init_name\033[0m"
    echo -e "\n\n==========生成/etc/init.d/$init_name：$(date "+%Y-%m-%d %H:%M:%S")==========" >> $install_log
}
# ======================= 上面是生成init.d的函数 =======================

# ====================== 下面是初始化数据库的函数 ======================
function initializeMysql(){
    [ ! -e "$home_dir/mysql/conf/my.cnf" ] && exitscripts 8
    rpm -q numactl-devel
    if [ $? -ne 0 ] 
    then
        yum -y install numactl-devel || exitscripts 3
        echo "安装numactl-devel成功"
        echo_log 1 "安装numactl-devel成功"
    fi
    $home_dir/mysql/bin/mysqld --defaults-file=$home_dir/mysql/conf/my.cnf --initialize
    initres=$?
    if [ $initres -eq 0 ] 
    then
        passwd=`cat $home_dir/mysql/log/mysql_error.log | grep password`
        echo "密码字段：$passwd"
        echo_log 1 "密码字段：$passwd"
    else
        exitscripts 9
    fi
}
# ====================== 上面是初始化数据库的函数 ======================


# 参数指定
function AllParams(){
    i=0
    for param in $@
    do
        params[$i]="$param"
        ((i++))
    done
    if [ ${#params[@]} -eq 0 ] 
    then
        exitscripts 7
    fi
    # 将参数都遍历一次，判断是否有其他参数
    i=0
    while [ $i -lt ${#params[@]} ]
    do
        case ${params[i]} in
            -f|--file)
                installFile="${params[i+1]}"
                echo_log 0  参数：installFile=$installFile
                ((i++))
            ;;
            -h|--help)
                echo -e "$helplist" && exit 0
            ;;
            --init)
                init_scripts
            ;;
            install|--install)
                startinstall
            ;;
            --path)
                updatePATH
            ;;
            --conf)
                buildcnf
            ;;
            --mysqlinit)
                initializeMysql
            ;;
            --optestinstall)
                optest {[{InstallDir}]}/Installed/mysql
            ;;
            *)
            ;;
        esac
        ((i++))
    done
}

# ========================== 安装开始 ==========================
startinstall(){
    echo -e "==========开始脚本：$(date "+%Y-%m-%d %H:%M:%S")==========\n\n" >> $install_log
    getVersion
    echo_log 0 版本：$InstallVersion
    installEnv

    for((i=0;i<5;i++));
    do
        echo 第$((i+1))次检查：
        checkEnv
        if [ ${EnvReady} -eq $listlen ] 
        then
            echo -e "\033[42;37m一共有${EnvReady}/$listlen个环境已被安装\033[0m"
            echo_log 0 第$((i+1))次检查：一共有${EnvReady}/$listlen个环境已被安装
            clear
            break 
        fi
        echo -e "\033[41;37m一共有${EnvReady}/$listlen个环境已被安装\033[0m"
        echo_log 3 第$((i+1))次检查：一共有${EnvReady}/$listlen个环境已被安装
    done

    echo -e "\033[44;37m版本为：$InstallVersion\033[0m"
    fileexist $installFile
    unarchive
    copyFile
    echo "日志记录:$install_log"
    echo -e "\n\n==========安装结束：$(date "+%Y-%m-%d %H:%M:%S")==========" >> $install_log
    init_scripts
    # updatePATH
    buildcnf
    initializeMysql
    exit 0
}
AllParams $Params
# ========================== 安装结束 ==========================



